Здравствуйте уважаемые форумчане.
Помогите до- реализовать несведующему небольшую конструкцию.
Суть в следующем. Имеется форма, открывающаяся в модальном окне:
модальное окно (код ниже):
<div id="myModal6" class="reveal-modal pay-list">
<div id="pay-list">
<script type="text/javascript"> //пассивная валидация полей формы
$(document).ready(function() {
$('.example2').ketchup({
validationAttribute: 'rel',
errorContainer: $('<div>', {
'class': 'ketchup-error-container-alt',
html: '<ol></ol>'
}),
initialPositionContainer: function(errorContainer, field) {
//errorContainer = контейнер для сообщений об ошибках со всеми наследниками
//field = поле, которое нужно проверить
},
positionContainer: function(errorContainer, field) {},
showContainer: function(errorContainer) {
errorContainer.slideDown('fast');
},
hideContainer: function(errorContainer) {
errorContainer.slideUp('fast');
}
});
});
</script>
<form action="" id="myform" name="myform">
<input type="text" name="pname" id="pname" />
<input type="text" name="pcode" id="pcode" />
<input type="text" name="pinfo" id="pinfo" />
<input type="text" name="price" id="price" />
<input type="button" onclick="send();" value="Отправить" />
</form>
<div id="alert"></div>
<div id="result"></div>
<script type="text/javascript">
function send() {
var pname = $('#pname').val() //Получаем параметры
var pcode = $('#pcode').val() //Получаем параметры
var pinfo = $('#pinfo').val() //Получаем параметры
var price = $('#price').val() //Получаем параметры
// Отсылаем паметры
$.ajax({
type: 'POST',
url: 'content/send-pay.php',
data: {onpname : pname, onpcode : pcode, onpinfo : pinfo, onprice : price},
// Выводим то что вернул PHP
success: function(html) {
$('#result').empty(); //предварительно очищаем нужный элемент страницы
$('#result').append(html); //и выводим ответ php скрипта
}
});
}
</script>
</div>
<a class="close-reveal-modal">×</a>
</div>
При нажатии
"Отправить" введенные в форму данные передаются
ajax-скриптом методом POST обработчику платежной формы
send-pay.php:
send-pay.php (код ниже)
<?php
class PayU
{
static $key, $merchant;
var $url = "https://securesite.ru/order/list.php";
function __construct( $merch, $key )
{
if ( !isset( $merch ) || !isset( $key ) ) die( "Error merchant settings" );
self::$merchant = $merch;
self::$key = $key;
}
#---------------------------------------------------------------------------------------
# Стандартные функции
#---------------------------------------------------------------------------------------
# Генерируем hmac для запроса.
function md5_hmac($key = null, $data)
{
if ( $key == null ) $key = self::$key;
$b = 64; # Длина байта для md5
if (strlen($key) > $b) $key = pack("H*",md5($key));
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;
return md5($k_opad . pack("H*", md5($k_ipad . $data)));
}
function Signature( $data = null )
{
if ( $data == null ) $data = $this->data;
$str = "";
foreach ( $data as $v ) $str .= $this->convData( $v );
return $this->md5_hmac( self::$key, $str );
}
#---------------------------------------------------------------------------------------
# Создаем запрос
#---------------------------------------------------------------------------------------
function update( $arr )
{
$this->data['MERCHANT'] = self::$merchant;
$this->data = array_merge( $this->data, $arr );
$this->data['ORDER_HASH'] = $this->Signature();
return $this;
}
function debug( $deb = 0 )
{
$this->data['TESTORDER'] = ( $deb == 1 ) ? "TRUE" : "FALSE";
$this->data['DEBUG'] = $deb;
return $this;
}
# Выводит строку в формате 'hmac'. Строка в формате 'aa' возвращается в '2aa'.
function convString($string)
{
return strlen($string) . $string;
}
# Так же, как convString,за исключением того,
# что здесь он получает массив строк и возвращает строку из всех значений в массиве.
function convArray($array)
{
$return = '';
foreach ($array as $v) $return .= $this->convString( $v );
return $return;
}
function convData( $val )
{
return ( is_array( $val ) ) ? $this->convArray( $val ) : $this->convString( $val );
}
# Делаем поля <input > для формы
function makeString ( $name, $val )
{
$str = "";
if ( !is_array( $val ) ) return '<input type="hidden" name="'.$name.'" value="'.$val.'">';
foreach ($val as $v) $str .= $this->makeString( $name.'[]', $v );
return $str;
}
function getForm()
{
$form = '<form method="post" action="'.$this->url.'" id="goform" name="goform">';
foreach ( $this->data as $k => $v ) $form .= $this->makeString( $k, $v );
return $form . "<input type='submit' name='submit' value='Автосабмит'></form>";
}
#---------------------------------------------------------------------------------------
# Читаем ответ
#---------------------------------------------------------------------------------------
function getPostData()
{
$this->post = $_POST;
$array = array( "IPN_PID", "IPN_PNAME", "IPN_DATE", "ORDERSTATUS" );
foreach ( $array as $name ) if (!isset( $this->post[$name] ) ) die( "Incorrect data" );
$this->datetime = date("YmdHis");
return $this;
}
function checkHashSignature()
{
$post = &$this->post;
$hash = $post["HASH"];
unset( $post["HASH"] );
$sign = $this->Signature( $post );
return ( $hash != $sign ) ? false : true ;
}
function createAnswer()
{
$datetime = &$this->datetime;
$post = &$this->post;
$data = array(
"IPN_PID" => $post[ "IPN_PID" ][0],
"IPN_PNAME" => $post[ "IPN_PNAME" ][0],
"IPN_DATE" => $post[ "IPN_DATE" ],
"DATE" => $datetime
);
$sign = $this->Signature( $data );
return "<EPAYMENT>$datetime|$sign</EPAYMENT>";
}
}
#--------------------------------------------------------------------------------------------
# Образец
#============================================================================================
$PayU = new PayU( 'xx-xx-xx', 'xxxxxx' );
if ( isset( $_GET['read'] ) ) # Читаем ответ
{
$check = $PayU->getPostData()->checkHashSignature();
if ( !$check ) die( "Incorrect signature" );
$answer = $PayU->createAnswer();
##
# Настраиваем
# переменные данные - $post или $_POST
##
die( $answer );
}
else # Создаем форму
{
$orderID = md5( "payuTestOrder_".time() );
$onpname = $_POST[onpname];
$onpcode = $_POST[onpcode];
$onpinfo = $_POST[onpinfo];
$onprice = $_POST[onprice];
$forSend = array (
'ORDER_REF' => $orderID,
'ORDER_DATE' => date("Y-m-d H:i:s"),
'ORDER_PNAME' => array( $onpname ),
'ORDER_PCODE' => array( $onpcode ),
'ORDER_PINFO' => array( $onpinfo ),
'ORDER_PRICE' => array( $onprice ),
'ORDER_QTY' => array( 1 ),
'ORDER_VAT' => array( 19 ),
'ORDER_SHIPPING' => array( 0.1 ),
'PRICES_CURRENCY' => "RUB"
);
$form = $PayU->update( $forSend )->debug(1)->getForm();
echo $form;
}
?>
...который в свою очередь обрабатывает полученные данные, собирает другую форму со скрытыми полями и подгружает её в то-же модальное окно, в блок
#result(
строка 13) - под первой формой выводится еще одна кнопка отправки. Я ее обозвал
"Автосабмит"(
строка 097) для наглядности.
Никак не получается реализовать авто-отправку второй формы методом того же ajax. Необходимо чтобы кнопка "Автосабмит" не появлялась, а вторая форма отправлялась с небольшой (регулируемой) задержкой. Желательно показать сообщение в случае ошибки отправки, в блоке
#alert(
строка 12).
Думаю созданная тема пригодится и другим посетителям форума.
Заранее спасибо, не раз находил здесь оригинальные и верные решения...